Skip to content

TCP 三次握手与四次挥手深度解析

核心特性

TCP (Transmission Control Protocol) 是一种 面向连接的、可靠的、基于字节流 的传输层通信协议。

  • 可靠性:通过序列号、确认应答、超时重传、流量控制、拥塞控制实现。
  • 全双工:通信双方可以同时发送和接收数据。

一、三次握手:建立连接

1. 图解流程

三次握手的本质是 确认双方的收发能力正常,并 同步初始序列号 (ISN)

TCP 三次握手流程
  • 第一次 (SYN):客户端发送 SYN,告诉服务器:"我想和你建立连接,我的初始序列号是 x"。
  • 第二次 (SYN+ACK):服务器返回 SYN+ACK,告诉客户端:"收到了,我也想建立连接,我的初始序列号是 y,我已经准备好接收你第 x+1 个字节了"。
  • 第三次 (ACK):客户端返回 ACK,告诉服务器:"收到了,我已经准备好接收你第 y+1 个字节了"。

2. 面试高频:为什么需要三次?

  • 两次不够:无法确认客户端的接收能力;且可能导致"已失效的连接请求"到达服务器后,服务器单方面建立连接造成资源浪费。
  • 四次多余:三次已经足够让双方确认收发能力并同步序列号,四次会降低效率。

二、TLS/SSL 握手:建立安全通道

前置知识

HTTPS = HTTP + TLS/SSL。在 TCP 连接建立后,如果需要加密通信(HTTPS),会先进行 TLS 握手,然后再传输 HTTP 数据。

📖 详细内容请查看TLS/SSL 握手与安全通信

1. 为什么需要 TLS/SSL?

HTTP 是明文传输,存在窃听、篡改、冒充三大风险。TLS 通过以下机制解决:

  • 机密性:通过对称加密防止数据被窃听
  • 完整性:通过 MAC 消息认证码防止数据被篡改
  • 身份认证:通过数字证书防止中间人攻击

2. 握手流程概览

TLS 握手分为四个阶段(详见 TLS/SSL 握手文档):

TLS/SSL 握手流程
  1. Client Hello:客户端发送支持的 TLS 版本、加密套件、随机数
  2. Server Hello + Certificate:服务器返回选定的参数、证书和随机数
  3. 密钥交换:客户端验证证书,生成 Pre-Master Secret 并用公钥加密发送
  4. Finished:双方推导 Session Key,验证握手完整性,开始加密通信

3. 核心要点速览

特性说明
加密方式握手阶段用非对称加密交换密钥,数据传输用对称加密
三个随机数Client Random + Server Random + Pre-Master Secret → Session Key
TLS 1.22-RTT(两次往返)
TLS 1.31-RTT(一次往返),支持 0-RTT 会话复用
会话复用Session ID / Session Ticket / 0-RTT

三、四次挥手:释放连接

1. 图解流程

由于 TCP 是 全双工 的,关闭连接需要双方分别确认,因此通常需要四次交互。

TCP 四次挥手流程
  • 第一次 (FIN):客户端发送 FIN,表示:"我不再发送数据了,但还可以接收"。
  • 第二次 (ACK):服务器返回 ACK,表示:"收到了,请稍等,我还有数据没发完(进入 CLOSE_WAIT 状态)"。
  • 第三次 (FIN):服务器发完数据后,发送 FIN,表示:"我也发完了,准备关闭"。
  • 第四次 (ACK):客户端返回 ACK,表示:"收到了,你关吧"。

2. 面试高频:为什么需要 TIME_WAIT (2MSL)?

主动关闭方在发送完最后一个 ACK 后,必须进入 TIME_WAIT 状态并等待 2MSL(报文最大生存时间的 2 倍)。

  1. 确保 ACK 到达:如果最后一个 ACK 丢失,服务器会重传 FIN,客户端需保持连接以重发 ACK。
  2. 清理旧报文:确保本次连接产生的所有报文在网络中彻底消失,防止干扰下一个新连接。

四、安全与性能:SYN Flood 攻击

1. 攻击原理

攻击者发送大量 SYN 报文但不回复最后一个 ACK,导致服务器的 半连接队列 (SYN Backlog) 被占满,正常用户无法连接。

SYN Flood 攻击与防御

2. 防御措施 (SYN Cookies)

  • 原理:服务器收到 SYN 时不立即分配资源,而是根据计算结果生成一个 Cookie 作为序列号返回。
  • 结果:只有收到合法的 ACKCookie 验证通过后,服务器才会分配资源建立连接。

五、完整流程总结:从 URL 到 HTTPS 页面

``mermaid sequenceDiagram participant C as 客户端 participant S as 服务器

Note over C,S: 1️⃣ DNS 解析
C->>C: 查询域名 IP

Note over C,S: 2️⃣ TCP 三次握手
C->>S: SYN
S->>C: SYN+ACK
C->>S: ACK

Note over C,S: 3️⃣ TLS 握手(HTTPS)
C->>S: Client Hello
S->>C: Server Hello + Certificate
C->>S: Key Exchange
C->>S: Finished
S->>C: Finished

Note over C,S: 4️⃣ HTTP 请求
C->>S: GET /index.html (加密)
S->>C: 200 OK + HTML (加密)

Note over C,S: 5️⃣ TCP 四次挥手
C->>S: FIN
S->>C: ACK
S->>C: FIN
C->>S: ACK

---

## 六、面试通关:标准回答

> **面试官:请详细描述 TCP 三次握手过程?**
>
> **标准回答:**
> 1.  **第一次**:客户端发送 SYN 包,进入 SYN_SENT 状态,同步 ISN。
> 2.  **第二次**:服务器返回 SYN+ACK 包,进入 SYN_RCVD 状态,确认客户端 ISN 并同步自身 ISN。
> 3.  **第三次**:客户端发送 ACK 包,双方进入 ESTABLISHED 状态。
> **总结**:三次握手确保了双方都具备正常的发送和接收能力,并初始化了序列号,为可靠传输打下基础。

> **面试官:为什么挥手要四次,而握手只需三次?**
>
> **标准回答:**
> 1.  握手时,服务器可以将 `SYN`(建立连接)和 `ACK`(确认收到)合并在一个包中发送。
> 2.  挥手时,当服务器收到 `FIN` 时,它可能还有未处理完的数据要发送,所以只能先回一个 `ACK` 表示收到。等数据发完后,服务器才发送自身的 `FIN`,因此这两步通常是分开的,导致了四次挥手。

> **面试官:HTTPS 是如何保证安全的?TLS 握手过程是怎样的?**
>
> **标准回答:**
> 1.  **安全机制**:HTTPS 通过 TLS/SSL 提供机密性(对称加密)、完整性(MAC 校验)、身份认证(数字证书)。
> 2.  **握手流程**:Client Hello → Server Hello + Certificate → 密钥交换 → Finished。详见 [TLS/SSL 握手文档](/http/tls-ssl-handshake)。
> 3.  **加密方式**:握手阶段使用非对称加密交换密钥,数据传输阶段使用对称加密(性能更高)。
> 4.  **优化方案**:TLS 1.3 将握手从 2-RTT 优化到 1-RTT,支持 0-RTT 会话复用进一步提升性能。

---

## 七、总结记忆口诀

🤝 三次握手建连接 一发二回三确认

🔐 TLS 握手保安全 证书验证换密钥 非对称换对称用 详见 /http/tls-ssl-handshake

👋 四次挥手断连接 一请二应三请四应

⏱️ TIME_WAIT 等 2MSL 保 ACK 达、清旧波

🛡️ SYN 攻击不用怕 Cookie 防御加限流


---

## 八、相关文档

- [TLS/SSL 握手与安全通信](/http/tls-ssl-handshake) - 深入了解 TLS 握手流程、版本对比、会话复用
- [HTTP1.1 vs HTTP2](/http/http1-vs-http2) - 了解应用层协议演进
- [从浏览器输入URL到页面渲染全过程](/http/url-to-render) - 了解完整网络流程
最近更新